#include "bsp_gpio.h"
#include "bsp_define.h"


GPIO_TypeDef* SY_GPIO_Group_Map[2] = {
    SYM_GPIOA,
    SYM_GPIOB,
};
const uint8_t SY_GPIO_Type_Map[4] = {
    GPIO_MODE_ANALOG,
    GPIO_MODE_INPUT,
    GPIO_MODE_OUTPUT_PP,
    GPIO_MODE_OUTPUT_OD,
};
const uint8_t SY_INT_Type_Map[3] = {
    GPIO_IT_NONE,
    GPIO_IT_RISING,
    GPIO_IT_FALLING,
};
const uint16_t SY_GPIO_Pin_Map[9] = {
    GPIO_PIN_0,
    GPIO_PIN_1,
    GPIO_PIN_2,
    GPIO_PIN_3,
    GPIO_PIN_4,
    GPIO_PIN_5,
    GPIO_PIN_6,
    GPIO_PIN_7,
    GPIO_PIN_8,
};
const uint8_t SY_GPIO_Pull_Map[2] = {
    GPIO_PULL_NONE,
    GPIO_PULL_UP,
};
const uint8_t SY_GPIO_Driver_Map[3] = {
    
};
int32_t bsp_gpio_init(bsp_gpio_init_t *init)
{
    if(init == NULL)
    {
        return BSP_BADPARA;
    }
   GPIO_InitTypeDef GpioInit;
   GpioInit.Mode = (GPIO_ModeTypeDef)SY_GPIO_Type_Map[init->output_type];
   GpioInit.IT = SY_INT_Type_Map[init->int_type];
   GpioInit.Pins = SY_GPIO_Pin_Map[init->pin];
   GpioInit.Pull = (GPIO_PullTypeDef)SY_GPIO_Pull_Map[init->pull]; 
   if(init->port == Group_GPIOA){
       HAL_SYSCTRL_GPIOA_CLK_ENABLE();
       HAL_GPIO_Init(SYM_GPIOA, &GpioInit);
   }
   else if(init->port == Group_GPIOB){
       HAL_SYSCTRL_GPIOB_CLK_ENABLE();
       HAL_GPIO_Init(SYM_GPIOB, &GpioInit);
   }
   bsp_set_gpio_func(init->port,init->pin,init->af);
   return BSP_OK;
}

void bsp_gpio_write(uint8_t port,uint8_t pin,uint8_t level)
{
    if(port == Group_GPIOA){
        HAL_GPIO_WritePins(SYM_GPIOA,SY_GPIO_Pin_Map[pin],(GPIO_PinState)level);
    }else if(port == Group_GPIOB){
        HAL_GPIO_WritePins(SYM_GPIOB,SY_GPIO_Pin_Map[pin],(GPIO_PinState)level);
    }
}
uint8_t bsp_gpio_read(uint8_t port,uint8_t pin)
{
    uint8_t res;
    if(port == Group_GPIOA){
        res = HAL_GPIO_ReadPin(SYM_GPIOA,SY_GPIO_Pin_Map[pin]);
    }else if(port == Group_GPIOB){
        res = HAL_GPIO_ReadPin(SYM_GPIOB,SY_GPIO_Pin_Map[pin]);
    }
    return res;
}
int32_t bsp_set_gpio_func(uint8_t port, uint8_t pin, uint8_t func)
{
//    SY_GPIO_Group_Map[port]->AFRL = 0;
//    SY_GPIO_Group_Map[port]->AFRH = 0;
    switch(pin){
        case 0:
            SY_GPIO_Group_Map[port]->AFRL_f.AFR0 = func;
        break;
        case 1:
            SY_GPIO_Group_Map[port]->AFRL_f.AFR1 = func;
        break;
        case 2:
            SY_GPIO_Group_Map[port]->AFRL_f.AFR2 = func;
        break;
        case 3:
            SY_GPIO_Group_Map[port]->AFRL_f.AFR3 = func;
        break;
        case 4:
            SY_GPIO_Group_Map[port]->AFRL_f.AFR4 = func;
        break;
        case 5:
            SY_GPIO_Group_Map[port]->AFRL_f.AFR5 = func;
        break;
        case 6:
            SY_GPIO_Group_Map[port]->AFRL_f.AFR6 = func;
        break;
        case 7:
            SY_GPIO_Group_Map[port]->AFRL_f.AFR7 = func;
        break;
        case 8:
            SY_GPIO_Group_Map[port]->AFRH_f.AFR8 = func;
        break;
    }
    return BSP_OK;    
}
/*******************************************************************************
  * @brief This function handles GPIOA.
  */
void GPIOA_IRQHandler(void)
{
    /* USER CODE BEGIN */

    /* USER CODE END */
}


/*******************************************************************************
  * @brief This function handles GPIOB.
  */
void GPIOB_IRQHandler(void)
{
    /* USER CODE BEGIN */

    /* USER CODE END */
}




